package asignacion5;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;

/**
 * Clase empleada para procesar un archivo de Texto (.txt) y procesar una salida
 * en archivo de bytes (.dat)
 * @author Rafael Carrillo 90465
 */
public class ProcesaCals {
    private int[] alumnos;
    private String in;
    private String out;
    private float[][] calificaciones;
    
    /**
     * Constructor que crea una instancia de la clase
     * @param in Archivo a leer ("archivo.txt")
     * @param out  Archivo a Escribir en formato .bin ("archivo.bin)
     */
    public ProcesaCals(String in,String out){
        this.in=in;
        this.out=out;
        leeArchivo(); //Lee el archivo .txt
        escribeCals();//Escribe archivo .dat
        leeCals(); // Lee archivo .dat
    }
    /**
     * Lee el archivo de texto y converte los valores de cadena a valores 
     * primarios (int, float)
     */
    public final void leeArchivo(){
        FileReader file=null;
        try{
            file=new FileReader(in);
        }catch(FileNotFoundException e){
            System.out.println("Error al abrir el archivo: "+in);
        }
        BufferedReader br=new BufferedReader(file);
        try{
            alumnos=new int[new Integer(br.readLine()).intValue()];
            calificaciones=new float[alumnos.length][5];
            for(int i=0;i<alumnos.length;i++){
                String[] line=br.readLine().split("\t");
                alumnos[i]=new Integer(line[0]);
                for(int j=0;j<=calificaciones.length;j++){
                    calificaciones[i][j]=new Float(line[j+1]).floatValue();
                }
                calificaciones[i][4]=promedio(calificaciones[i]);
            }
        }catch(IOException e){
            System.out.println("Error al leer el archivo");
        }
    }
    /**
     * Devuelve el promedio de los valores del arreglo del parametro
     * @param cals Arreglo con valores a promediar
     * @return Promedio
     */
    private float promedio(float[] cals){
        float cal=0;
        for(int i=0;i<=cals.length-1;i++){
            cal+=cals[i];
        }
        return cal/cals.length;
        
    }
    /**
     * Lee los datos del archivo .dat dado por el parametro out del constructor
     */
    public final void leeCals(){
        FileInputStream fileIS=null; 
        DataInputStream data=null;
        alumnos=null;// Reiniciar los arreglos para no declarar nuevos
        calificaciones=null; 
        try{
            fileIS=new FileInputStream(out);            
        }
        catch(FileNotFoundException e){
            System.out.println("Error no existe el achivo: "+in);
            return;
        }
        data=new DataInputStream(fileIS);        
        try{
            alumnos=new int[data.readInt()];
            calificaciones=new float[alumnos.length][5];
            for(int i=0;i<alumnos.length;i++){
                alumnos[i]=data.readInt();
                for(int j=0;j<calificaciones[i].length;j++){
                    calificaciones[i][j]=data.readFloat();
                }
            }
        }catch(IOException e){
            System.out.println("Error al leer el archivo");
        }
    }
    /**
     * Escribe los valores de los arreglos a un archivo .dat
     * el nombre del archivo es dado por el parametro out.
     */
    public final void escribeCals(){
        FileOutputStream fileOS=null;
        DataOutputStream data;
        try{
            fileOS=new FileOutputStream(out);
        }catch (Exception e){
            System.out.println("Error al crear archivo");
        }
        data=new DataOutputStream(fileOS);
        try{
            data.writeInt(alumnos.length);
            for(int i=0;i<alumnos.length;i++){
                data.writeInt(alumnos[i]);
                for(int j=0;j<=calificaciones.length+1;j++){
                    data.writeFloat(calificaciones[i][j]);
                }
            }
        }
        catch(IOException e){
            System.out.println("Error al escribir en el archivo");
        }
        try{
            data.close();
            fileOS.close();
        }catch(IOException e){
            System.out.println("Error al cerrar el archivo");
        }
        
        
        
    }
    /**
     * Imprime en pantalla los nuevos valores de los arreglos alumnos y calificaciones
     * con formato decimal (#.#) para calificaciones
     */
    public final void tabulaCals(){
        DecimalFormat fCal=new DecimalFormat("#.0");
        System.out.println("Alumnos: "+alumnos.length+"\n");
        System.out.println("Alumno\tCalificacion 1\t Calificacion 2\t Calificacion 3\t"
                + "Calificacion4\tPromedio");
        for(int i=0;i<alumnos.length;i++){
            System.out.print(alumnos[i]+"\t");
            for(int j=0;j<calificaciones[i].length;j++){
                System.out.print("   "+fCal.format(calificaciones[i][j])+"\t\t");
            }
            System.out.println();
        }
    }
}
